package com.kylin.common.saas.datasource;

import com.baomidou.dynamic.datasource.processor.DsProcessor;
import com.kylin.common.core.util.SpringUtils;
import org.aopalliance.intercept.MethodInvocation;

import javax.sql.DataSource;

/**
 * 参数数据源解析  @DS("#tenant")
 *
 * @author wuhao
 * @version 1.0 - 2022/7/20
 */
public class DataSourceProcessor extends DsProcessor {

    private static final String KEY = "#tenant";

    /**
     * 抽象匹配条件 匹配才会走当前执行器否则走下一级执行器
     *
     * @param key DS注解里的内容
     * @return 是否匹配
     */
    @Override
    public boolean matches(String key) {
        return key.startsWith(KEY);
    }

    /**
     * 抽象最终决定数据源
     *
     * @param invocation 方法执行信息
     * @param key        DS注解里的内容
     * @return 数据源名称
     */
    @Override
    public String doDetermineDatasource(MethodInvocation invocation, String key) {
        Object[] arguments = invocation.getArguments();
        // 获取注解方法的连接名称(此处是把数据库ID当成连接名称)
        String testDbId = String.valueOf(arguments[arguments.length - 1]);
        // 验收数据源是否有效
        DataSourceManager testManager = SpringUtils.getBean("DataSourceManager");
        DataSource dbSource = testManager.getDbSource(testDbId);
        if (dbSource != null) {
            return testDbId;
        } else {
            throw new RuntimeException("数据源" + testDbId + "已断开！");
        }


    }
}

